In [1]:
import numpy as np
import pandas as pd
from sklearn.neighbors import KDTree
from sklearn.datasets import load_iris
from sklearn.metrics import silhouette_score, homogeneity_score
from sklearn.cluster import KMeans, DBSCAN
In [ ]:
class ClusteringReports:
    def __init__(self):
        pass
    
    # Hopkinsova statistika,
    # test postojanja grupisanja podataka / klastera
    def hopkins(self, X, m=30):
        # TODO: Provera ulaza
        self.X = X
        
        tree = KDTree(X)
            
        X_copy = X.copy()
        np.random.shuffle(X_copy)
        X_sample = X_copy[:30]
        
        lower = np.min(X, axis=0)
        higher = np.max(X, axis=0)
        
        Y = np.random.uniform(lower.ravel(), higher.ravel(), (m, X.shape[1]))
        
        U = tree.query(Y, 2, return_distance=True)[0][:, 1].sum()
        W = tree.query(X_sample, 2, return_distance=True)[0][:, 1].sum()
        
        return U / (U + W)
    
    # Silueta,
    # Test kvaliteta klasterovanja na osnovu poredjenja medjusobnih udaljenosti
    # tacaka unutar jednog klastera u odnosu na tacke najblizih susednih klastera
    def silhouette(self, X, label):
        return silhouette_score(X, labels)
    
    # Skor homogenosti,
    # Test kvaliteta klasterovanja na osnovu cistoce klastera u odnosu na zastupljenost
    # tacaka razlicitih klasa. (Entropija)
    def homogeneity(self, class_labels, cluster_labels):
        return homogeneity_score(class_labels, cluster_labels)
    
    # Generisanje izvestaja klasterovanja
    def generate_report(self, X, cluster_labels, class_labels=None):
        
        report = ''
        report += '============== REPORT ===============\n'
        report += f'Num samples: {X.shape[0]}\n'
        
        if class_labels is not None:
            report += f'Num classes: {len(set(class_labels.ravel()))}\n'
            
        report += f'Num attributes: {X.shape[1]}\n'
            
        report += f'Num clusters: {len(set(cluster_labels.ravel()))}\n'
        report += '\n'
        
        report += f'Silhouette coef.: {self.silhouette(X, labels)}\n'
        report += f'Homogeneity score: {self.homogeneity(class_labels, cluster_labels)}\n'
        
        report += f'Elapsed time: {"N/A"}\n'
        report += f'Num iterations: {"N/A"}\n'
        report += '====================================\n'
        
        f = open('output.txt', 'w')
        f.write(report)
        f.close()
        
        report_data = np.concatenate([X, cluster_labels.reshape(cluster_labels.shape[0], 1)], axis=1)
        
        # if not dataframe:
        columns = [f'Attribute_{i}' for i in range(1, X.shape[1] + 1)] + ['Cluster']
        
        df = pd.DataFrame(report_data, columns=columns)
        df = df.astype({ 'Cluster': 'int'})
        
        df.to_csv('output.csv', index=False)
        
        return True